#include <stdio.h>
#include <signal.h>
#include <unistd.h>


static void handler1(int sig);

int main(void)
{
    int i, j;
    sigset_t set, oldset; // 信号集 和 当前信号集（修改前的信号集）

    signal(SIGINT, handler1); 
    signal(SIGUSR1, handler1);
    signal(SIGRTMIN+5, handler1); // 注册一个实时信号，实时信号不会丢失

    sigemptyset(&set); // 初始化空信号集
    sigemptyset(&oldset);

    sigaddset(&set, SIGINT); // 添加信号到信号集
    sigaddset(&set, SIGRTMIN+5);

    // 希望下方的打印程序不被SIGINT信号打断
    sigprocmask(SIG_BLOCK, &set, &oldset); // 将阻塞信号集置为set和oldset的并集
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 5; j++) {
            write(1, "*", 1);
            sleep(1);
        }
        printf("\n");

        // SIGINT信号驱动进程的运行
        /*
           sigprocmask(SIG_SETMASK, &oldset, NULL); // 将阻塞信号集置为NULL
           pause();
           sigprocmask(SIG_BLOCK, &set, NULL);  
         */

        sigsuspend(&oldset);
    }

    return 0;
}

static void handler1(int sig)
{
    write(1, "!", 1);
}
